June 06, 2021
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
핵심 로직을 간단하게 하기 위해서 map 컨테이너로 각 숫자의 좌표를 미리 정해두었다. 이 좌표를 기준으로 2, 5, 8, 0 이 나왔을 때는 현재 왼손과 오른손의 위치를 기준으로 거리를 계산하고, 아닐 때는 왼손, 오른손을 정답 문자열에 입력해준다.
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <iostream>
using namespace std;
int calcDist(pair<int, int> p1, pair<int, int> p2){
return abs(p1.first-p2.first) + abs(p1.second-p2.second);
}
string solution(vector<int> numbers, string hand) {
map<int, pair<int, int>> keypads = {
{1, {0, 0}}, {2, {0, 1}}, {3, {0, 2}},
{4, {1, 0}}, {5, {1, 1}}, {6, {1, 2}},
{7, {2, 0}}, {8, {2, 1}}, {9, {2, 2}},
{-2, {3, 0}}, {0, {3, 1}}, {-1, {3, 2}}
};
int currLeft = -2;
int currRight = -1;
string answer = "";
for (auto num : numbers){
bool isRight = true;
if (num == 1 || num == 4 || num == 7){
isRight = false;
}
else if (num == 3 || num == 6 || num == 9){
isRight = true;
}
else{
int distFromLeft = calcDist(keypads[currLeft], keypads[num]);
int distFromRight = calcDist(keypads[currRight], keypads[num]);
if (distFromLeft < distFromRight){
isRight = false;
}
else if (distFromLeft > distFromRight){
isRight = true;
}
else if (hand.compare("right") == 0){
isRight = true;
}
else{
isRight = false;
}
}
if(isRight){
currRight = num;
answer += 'R';
}
else{
currLeft = num;
answer += 'L';
}
}
return answer;
}